//
//  YFLoginHelper.m
//  SquashSpark
//
//  Created by Coollang on 2017/11/14.
//  Copyright © 2017年 Coollang-YF. All rights reserved.
//

#import "YFLoginHelper.h"
#import "YFUserDefaults.h"
#import "YFNetworkingService.h"
#import "YFLoginApi.h"
#import "UIImage+HXExtension.h"

@implementation YFLoginHelper

+ (void)loginByEmail:(NSString *)email password:(NSString *)password complete:(LSLoginCompleteBlock)complete {
    YFLoginApi *emailLoginApi = [YFLoginApi loginApiType:kLoginEmailSignInApi email:email password:password];
    [[YFNetworkingService sharedInstance] sendRequest:emailLoginApi callback:^(BOOL success, id result, NSError *error) {
        if (success) {
            
        }
    }];
}

+ (void)uploadUserHeadIconImage:(UIImage *)image completed:(void(^)(NSString *url, NSError *error))block{
    YFLoginApi *applyTokenApi = [YFLoginApi applyUploadHeadIconToken];
    [[YFNetworkingService sharedInstance] sendRequest:applyTokenApi callback:^(BOOL success, id result, NSError *error) {
        // q/usericon_11_20171120135937.jpg
        if (success) {
            QNUploadManager *manager = [YFNetworkingService qNUploadManager];
            QNUploadOption *option = [[QNUploadOption alloc] initWithProgressHandler:^(NSString *key, float percent) {
                YFLog(@"------>%f",percent);
            }];
            NSDictionary *dict = [result responseInfo];
            NSData *headIcondata = [image compressToDataHX];
            [manager putData:headIcondata key:dict[@"key"] token:dict[@"token"] complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
                if (info.isOK) {
                    UserInfoItem *userInfoItem = [User getUseInfo];
                    [[RLMRealm defaultRealm] beginWriteTransaction];
                    userInfoItem.icon = [kImageBaseUrl stringByAppendingString:key];
                    [[RLMRealm defaultRealm] commitWriteTransaction];
                    if (block) {
                        block([kImageBaseUrl stringByAppendingString:key],nil);
                    }
                }else {
                    if (block) {
                        block(nil,info.error);
                    }
                }
            } option:option];
        }else {
            if (block) {
                block(nil,error);
            }
            
        }
    }];
}

// 获取并保存用户信息
+ (void)getuserInfoItemCompleted:(void(^)(NSError *error))completed {
    YFLoginApi *getUserInfoApi = [YFLoginApi getUserInfo];
    [[YFNetworkingService sharedInstance] sendRequest:getUserInfoApi callback:^(BOOL success, id result, NSError *error) {
        if (success) {
            UserInfoItem *infoItem = [User getUseInfo];
            [[RLMRealm defaultRealm] beginWriteTransaction];
            [infoItem parseUserInfoDictionary:[result responseInfo]];
            [[RLMRealm defaultRealm] commitWriteTransaction];
            if (completed) {
                completed(nil);
            }
        }else {
            if (completed) {
                completed(error);
            }
        }
        
    }];
}

+ (void)uploadUserInfoWithInfoItem:(UserInfoItem *)infoItem completed:(void(^)(NSError *error))completed {
    // 将数据上传到网络
    YFLoginApi *uploadInfoAPi = [YFLoginApi uploadUserInfoWithUserInfoItem:infoItem];
    [[YFNetworkingService sharedInstance] sendRequest:uploadInfoAPi callback:^(BOOL success, id result, NSError *error) {
        if (success) {
            YFLog(@"上传成功");
            [[User getUseInfo] copyValuesFrom:infoItem];
            if (completed) {
                completed(nil);
            }
        }else {
            NSLog(@"%@",error.domain);
            if (completed) {
                completed(error);
            }
        }
    }];
}

#pragma mark - 账号检测相关方法
+ (BOOL)checkPhoneNumber:(NSString *)numberString legalWithAreaCodeArray:(NSArray *)array result:(LSPhoneCheckResultBlock)result{
    if ([numberString isEqualToString:@"13800138000"]) {
        result(YES,numberString);
        return YES;
    }
    int compareResult = 0;
    for (int i=0; i<array.count; i++) {
        NSDictionary* dict1=[array objectAtIndex:i];
        NSString* code1=[dict1 valueForKey:@"zone"];
        if ([code1 isEqualToString:[YFLoginHelper defaultLocalAreaCode]]) {
            compareResult = 1;
            NSString* rule1 = [dict1 valueForKey:@"rule"];
            NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",rule1];
            BOOL isMatch = [pred evaluateWithObject:numberString];
            if (!isMatch) {
                //手机号码不正确
                result(NO,@"手机号码非法，请重新填写");
                return NO;
            }
            break;
        }
    }
    result(YES,numberString);
    return YES;
}

+ (BOOL)checkPassword:(NSString *)password userPredicate:(BOOL)pre{
    if (pre) {
        NSString *passwordRegex = @"[A-Z0-9a-z_-]{6,20}$";//@"[A-Z0-9a-z_+-]{6,20}$";
        NSPredicate *passwordVerify = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", passwordRegex];
        return [passwordVerify evaluateWithObject:password];
    }else {
        if (!password) {
            return YES;
        }
        return password.length>=6 && password.length<=20;
    }
}


+ (BOOL)checkEmail:(NSString *)email{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailVerify = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailVerify evaluateWithObject:email];
}
+ (BOOL)checkAgeInOneTohundred:(NSString *)age {
    NSString *ageRegex = @"^(?:[1-9]?\\d|100)$";
    NSPredicate *ageVerify = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", ageRegex];
    return [ageVerify evaluateWithObject:age];
}

+ (BOOL)checkPassword:(NSString *)password repeatPassword:(NSString *)rePassword complete:(LSCheckDataCompleteBlock)complete {
    
    if (!password||!password.length) {
        complete(NO,NSLocalizedString(@"Please enter a password", nil));return NO;
    }
    if (!rePassword||!rePassword.length) {
        complete(NO,NSLocalizedString(@"Please enter a password", nil));return NO;
    } else if (![YFLoginHelper checkPassword:password userPredicate:YES] || ![YFLoginHelper checkPassword:rePassword userPredicate:YES]) {
        complete(NO,NSLocalizedString(@"Your email or password was entered incorrectly", nil));return NO;
    } else if (rePassword && ![rePassword isEqualToString:password]) {
        complete(NO,NSLocalizedString(@"Password inconsistent, please re-enter", nil));return NO;
    } else {
        complete(YES,password);return YES;
    }
}

+ (void)checkAccount:(NSString *)account password:(NSString *)password isChinese:(BOOL)isChinese complete:(LSCheckDataCompleteBlock)complete {
    [YFLoginHelper checkAccount:account password:password isChinese:isChinese verifyCode:@"-1"  repeatPassword:@"none" complete:complete];
}

+ (void)checkAccount:(NSString *)account password:(NSString *)password isChinese:(BOOL)isChinese verifyCode:(NSString *)verifyCode repeatPassword:(NSString *)rePassword complete:(LSCheckDataCompleteBlock)complete {
    
    if (!isChinese) { //英文
        if (![YFLoginHelper checkEmail:account]) {
            complete(NO,NSLocalizedString(@"Please enter a valid email address", nil)); return;
        }
        if (!password||!password.length) {
            complete(NO,NSLocalizedString(@"Please enter a password",nil));return;
        }
        if (![rePassword isEqualToString:@"none"]) {
            if (!rePassword||!password.length) {
                complete(NO,NSLocalizedString(@"Please repeat your password",nil));return;
            } else if (rePassword && ![rePassword isEqualToString:password]) {
                complete(NO,NSLocalizedString(@"Password inconsistent, please re-enter",nil));return;
            }
        }
        if (![YFLoginHelper checkPassword:password userPredicate:YES]) {
            complete(NO,NSLocalizedString(@"Your email or password was entered incorrectly",nil));return;
        } else {
            complete(YES,account);return;
        }
    }
    
    if (isChinese) { //中文
        if (!account||!account.length) {
            complete(NO,NSLocalizedString(@"Please enter a valid email address",nil));return;
        }
        if (!password||!password.length) {
            complete(NO,NSLocalizedString(@"Please enter a password",nil));return;
        }
        if ((!verifyCode||!verifyCode.length) &&(![verifyCode isEqualToString:@"-1"])) {
            complete(NO,NSLocalizedString(@"Please enter a valid Verification Code",nil));return;
        }
        if (![YFLoginHelper checkPassword:password userPredicate:YES]) {
            complete(NO,NSLocalizedString(@"Your email or password was entered incorrectly",nil));return;
        }
        [YFLoginHelper checkPhoneNumber:account result:^(BOOL success, NSString *phoneNumber) {
            if (!success) {
                complete(NO,@"手机号码非法，请重新填写");
            } else {
                complete(YES,account);
            }
        }];
    }
}

+ (void)showFaultAlertViewWithMessage:(NSString *)message onClick:(void(^)())cancelAction {
    FUIAlertView *alertView =[FUIAlertView alertWithTitle:@"Prompt" message:message cancelTitle:@"OK" confirmTitle:nil];
    [alertView setOnCancelAction:^{
        if (cancelAction) {
            cancelAction();
        }
    }];
    [alertView show];
}


+ (void)checkPhoneNumber:(NSString *)numberString result:(LSPhoneCheckResultBlock)result {
    
    if (!numberString || !numberString.length) {
        result(NO,NSLocalizedString(@"Please enter a valid email address",nil)); return;
    }
    if ([numberString isEqualToString:@"13800138000"]) {
        result(YES,numberString);
        return ;
    }
    if ([YFLoginHelper isChineseLanguage]) {
        //区号数据
        NSArray *areaArray = [YFUserDefaults zonesArray];
        if (!areaArray || !areaArray.count) {
            [YFLoginHelper fetchSupportedZoneArray];
            result(NO,@"没有数据， 请检查网络");
            return;
        }
        [YFLoginHelper checkPhoneNumber:numberString legalWithAreaCodeArray:areaArray result:result];
    } else {
        if ([YFLoginHelper checkEmail:numberString]) {
            result(YES,numberString);
        } else {
            result(NO,NSLocalizedString(@"Please enter a valid email address",nil));
        }
    }
}
+ (void)fetchSupportedZoneArray {
    //获取支持的地区列表
//    [SMSSDK getCountryZone:^(NSError *error, NSArray *zonesArray) {
//        if (!error) {
//            [DataModal setZonesArray:zonesArray];
//        } else {
//            NSLog(@"failed to get the area code _%@",[error.userInfo objectForKey:@"getZone"]);
//        }
//    }];
}


+ (NSString *)defaultLocalAreaCode
{
    NSLocale *locale = [NSLocale currentLocale];
    
    NSDictionary *dictCodes = [NSDictionary dictionaryWithObjectsAndKeys:@"972", @"IL",
                               @"93", @"AF", @"355", @"AL", @"213", @"DZ", @"1", @"AS",
                               @"376", @"AD", @"244", @"AO", @"1", @"AI", @"1", @"AG",
                               @"54", @"AR", @"374", @"AM", @"297", @"AW", @"61", @"AU",
                               @"43", @"AT", @"994", @"AZ", @"1", @"BS", @"973", @"BH",
                               @"880", @"BD", @"1", @"BB", @"375", @"BY", @"32", @"BE",
                               @"501", @"BZ", @"229", @"BJ", @"1", @"BM", @"975", @"BT",
                               @"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
                               @"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
                               @"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
                               @"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
                               @"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
                               @"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
                               @"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
                               @"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
                               @"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
                               @"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
                               @"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
                               @"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
                               @"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
                               @"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
                               @"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
                               @"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
                               @"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
                               @"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
                               @"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
                               @"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
                               @"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
                               @"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
                               @"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
                               @"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
                               @"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
                               @"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
                               @"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
                               @"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
                               @"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
                               @"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
                               @"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
                               @"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
                               @"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
                               @"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
                               @"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
                               @"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
                               @"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
                               @"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
                               @"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
                               @"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
                               @"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
                               @"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
                               @"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
                               @"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
                               @"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
                               @"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
                               @"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
                               @"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
                               @"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
                               @"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
                               @"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
                               @"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963", @"SY",
                               @"886", @"TW", @"255", @"TZ", @"670", @"TL", @"58", @"VE",
                               @"84", @"VN", @"1", @"VG", @"1", @"VI", nil];
    
    NSString *tt = [locale objectForKey:NSLocaleCountryCode];
    NSString *defaultCode = [dictCodes objectForKey:tt];
    if ([YFLoginHelper isChineseLanguage]) {
        defaultCode = @"86";
    }
    return defaultCode;
}

+ (BOOL)isChineseLanguage
{
    NSArray *languages = [NSLocale preferredLanguages];
    NSString *currentLanguage = [languages objectAtIndex:0];
    if ([currentLanguage rangeOfString:@"zh"].location != NSNotFound){
        return YES;
    }
    return NO;
}


@end
